package com.zxlspace.collection2;

/**
 * 父类为泛型类
 * 1.属性
 * 2.方法
 *
 * 要么同时檫除，要么子类大于等于父类的类型
 * 不能子类檫除，父类为泛型
 * 1.属性类型
 * 在父类中，随父类而定
 * 子类中，随子类而定
 * 2.方法重写
 * 随父类而定
 * @param <T1>
 * @param <T2>
 */
public abstract class Father<T1, T2> {
    T1 name;

    public abstract void test(T1 t1);
}


/**
 * 子类声明必须指定具体类型
 * 属性为具体类型
 * 方法同理
 */
class Child extends Father<String, Integer> {


    @Override
    public void test(String s) {
        String str = this.name;  //属性直接变为泛型指定类型
    }
}

/**
 * 子类为泛型类，类型在使用时确定，必须继承父类
 * 子类泛型必须大于等于父类
 * @param <T1>
 * @param <T2>
 */
class Child1<T1, T2> extends Father<T1, T2> {

    @Override
    public void test(T1 t1) {

    }
}

/**
 * 子类为泛型类，父类不指定类型，泛型的檫除，使用object替换
 * @param <T1>
 * @param <T2>
 */
class Child2<T1, T2> extends Father {

    @Override
    public void test(Object o) {

    }
}

/**
 * 子类与父类同时檫除
 *
 */
class Child4 extends Father {

    @Override
    public void test(Object o) {

    }
}

